
package gestion;

import dao.EntityAlreadyExistsException;
import dao.InexistantEntityException;
import entities.Commande;
import entities.Produit;
import java.util.List;
import javax.ejb.Remote;

/**
 * Interface du Gestionnaire utilisé par les clients (lourd ou web) : Utiliser JNDI et pas @EJB
 * @author Alex
 */
@Remote
public interface GestionnaireRemote {

    /**
     * Crée un nouveau client en base : l'id sera généré automatiquement
     * @param nom
     * @param prenom
     * @throws EntityAlreadyExistsException ne devrait pas se produire
     */
    public void creerClient(String nom, String prenom) throws EntityAlreadyExistsException;

    /**
     * Crée un nouveau produit en base
     * @param reference
     * @param nom
     * @param prix
     * @param idCategorie
     * @throws InexistantEntityException : si l'idCategorie n'existe pas en base
     * @throws EntityAlreadyExistsException : si un produit avec cette référence existe déjà en base.
     */
    public void creerProduit(Integer reference, String nom, double prix, Integer idCategorie) throws InexistantEntityException, EntityAlreadyExistsException;

    /**
     * Crée une nouvelle catégorie en base
     * @param libelle
     * @throws EntityAlreadyExistsException ne devrait pas se produire
     */
    public void creerCategorie(String libelle) throws EntityAlreadyExistsException;

    /**
     * Crée une nouvelle commande en base
     * @param referenceProduit
     * @param idClient
     * @param quantity
     * @throws InexistantEntityException si le produit ou le client n'existent pas en base
     * @throws EntityAlreadyExistsException si l'association produit-client existe déjà en base
     */
    public void creerCommande(int referenceProduit, int idClient, int quantity) throws InexistantEntityException, EntityAlreadyExistsException;

    /**
     * Renvoie la liste de tous les objets d'un type depuis la base de données.
     * @param objectType le type d'objet demandé
     * @return
     */
    public List<?> getAll(Class objectType);

    /**
     * Renvoie un objet à partir de la base de données
     * @param objectType : le type de l'objet à renvoyer
     * @param id : l'id de l'objet à récupérer
     * @return l'objet voulu
     * @throws InexistantEntityException si l'objet correspondant à cet id n'existe pas.
     */
    public Object get(Class objectType, Object id) throws InexistantEntityException;

    /**
     * Renvoie la liste des produits d'une catégorie
     * @param idCategorie
     * @return
     * @throws InexistantEntityException si la catégorie n'existe pas
     */
    public List<Produit> getProduitsDeCategorie(int idCategorie) throws InexistantEntityException;

    /**
     * Renvoie la liste des commandes d'un client
     * @param idClient
     * @return
     * @throws InexistantEntityException si le client n'existe pas
     */
    public List<Commande> getCommandesDuClient(int idClient) throws InexistantEntityException;

    /**
     * Renvoie la liste des commandes d'un produit
     * @param produit
     * @return
     */
    public List<Commande> getCommandesDuProduit(Produit produit);

    /**
     * Modifie un client
     * @param idClient le client à modifier
     * @param nom le nouveau nom
     * @param prenom le nouveau prénom
     * @throws InexistantEntityException si le client à modifier n'existe pas
     */
    public void modifierClient(Integer idClient, String nom, String prenom) throws InexistantEntityException;

    /**
     * Modifie une catégorie
     * @param idCategorie la catégorie à modifier
     * @param libelle le nouveau libellé
     * @throws InexistantEntityException si la catégorie à modifier n'existe pas
     */
    public void modifierCategorie(Integer idCategorie, String libelle) throws InexistantEntityException;

    /**
     * Modifier un produit
     * @param idProduit le produit à modifier
     * @param nom le nouveau nom
     * @param prix le nouveau prix
     * @param idCategorie la nouvelle catégorie
     * @throws InexistantEntityException si le produit à modifier ou la nouvelle catégorie n'existent pas
     */
    public void modifierProduit(Integer idProduit, String nom, Double prix, Integer idCategorie) throws InexistantEntityException;

    /**
     * Supprimer un client
     * @param idClient
     * @throws InexistantEntityException si le client n'existe pas
     */
    public void supprimerClient(Integer idClient) throws InexistantEntityException;

    /**
     * Supprimer une catégorie
     * @param idCategorie
     * @throws InexistantEntityException si la catégorie n'existe pas
     */
    public void supprimerCategorie(Integer idCategorie) throws InexistantEntityException;

    /**
     * Supprimer un produit
     * @param idProduit
     * @throws InexistantEntityException si le produit n'existe pas
     */
    public void supprimerProduit(Integer idProduit) throws InexistantEntityException;
    
}
